import socket
# #-----------------UDP-----------------------
# # ############发送数据#############
# # # #不同电脑之间通讯需要使用socket
# # # #socket可以在不同电脑之间进行通信还可以在同一个电脑之间的不同程序之间进行通信
# # s1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
# # s1.bind(("192.168.0.101", 9000))
# # # #创建socket,并连接
# # # #af_inet 表示这个是网络连接
# # # #sock_dgram 表示连接是一个udp连接

# # s1.sendto("hello你好".encode("utf8"), ("192.168.0.105", 9000))
# # data, addr = s1.recvfrom(1024)#阻塞等待 只能一下一下  多任务可以试试
# # print("从{}地址{}端口收到{}信息".format(addr[0], addr[1], data.decode("utf8")))
# # # #data :要发送的数据,表示他是一个二进制数据
# # # #address:发送给谁,参数是一个元组,元组需要2个元素
# # # #第0个是目标的ip  第1个是目标端口  ('192.168.83.130',9000)
# # s1.close()


# ############接受数据###############
# # s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# # #要接受要绑定端口号和
# # s2.bind(('192.168.83.130',9000))
# # data,addr=s2.recvfrom(1024) #是一个阻塞方法
# # print(aaa)
# # s2.close()
# # #接受数据
# # print('从{}地址{}端口收到{}信息'.format(addr[0],addr[1],data.decode('utf8')))


# #--------------tcp----------------
# # 拥有和客户端和服务器概念,udp没有这个概念
# # -----tcp客户端
# s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#tcp sock_strea
# # 发送数据之前需要建立连接 握手3次
# s.connect(('192.168.0.105',9000))#建立连接
# s.send('hello'.encode('utf8'))
# s.close()

# # -----tcp服务器端
# s1=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#tcp sock_strea
# s1.connect(('192.168.0.105',9000))#建立连接
# s1.listen(128)  #监听socket 最大处理数 多的加入队列(128容量)队列满了多出的部分连接失败
# aa,bb=s1.accept()  #接受客户端的请求
# cc=bb.recvfrom(1024) #取出数据

# -----tcp文件下载


# -----多线程聊天
# 创建线程
# T1=threading.Thread(target="函数指定需要执行的任务")
# 启动线程
# T1.start()
import socket
import threading
# s2=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
# s2.bind(('192.168.0.105',9090))


# def send_msg():
#     while True:
#         msg=input('请输入要发送的文字')
#         s2.sendto(msg.encode('utf8'),('192.168.0.105',9091))
#         if msg=='exit':
#             break
# def recv_msg():
#     while True:
#         data,addr=(s2.recvfrom(1024))
#         file1=open('消息记录.txt','w',encoding='utf8')
#         print('接受到来自{}地址{}端口的信息,信息是{}'.format(addr[0],addr[1],data),file=open('消息记录.txt','a',encoding='utf8'))


# t11=threading.Thread(target=send_msg)
# t12=threading.Thread(target=recv_msg)

# t11.start()
# t12.start()


# -----同步锁
from time import sleep
# ticket=20
# lock=threading.Lock() #定义锁 加锁会变慢
# def sell_ticket():
#     global ticket
#     while True:
#         lock.acq-+
#         +uire() #同步锁
#         if ticket>0:
#             sleep(0.1)# 需要加锁 防止出现负数
#             ticket-=1
#             lock.release() #解除同步锁
#             print('{}卖出一张票 还有{}'.format(threading.current_thread().name,ticket))

#         else:
#             lock.release() #解除同步锁
#             print('没有票了')
#             break

# # sell_ticket()
# t1=threading.Thread(target=sell_ticket,name='1号窗口')
# t2=threading.Thread(target=sell_ticket,name='2号窗口')
# t1.start()
# t2.start()

# -----线程间通信
# queue 队列
# import queue
# q=queue.Queue()
# def produce():
#     for i in range(30):
#         sleep(1.5)
#         print('{}生产了面包b{}'.format(threading.current_thread().name,i))
#         q.put('b{}'.format(i))
# def consumer():

#     for i in range(30):
#         sleep(0.3)
#         print('{}消费了面包'.format(threading.current_thread().name),q.get())

# p1=threading.Thread(target=produce,name='商人')
# c1=threading.Thread(target=consumer,name='买家')
# p1.start()
# c1.start()


# -------------进程
# 进程可以在任务管理器中看到  os.getpid()
# 分主进程和分进程,主进程结束,任务结束,分进程结束结束分进程部分

import multiprocessing
# def dance(k):
#     for _ in range(k):
#         sleep(0.2)
#         print('跳舞')
# def sing(n):
#     for _ in range(n):
#         sleep(0.2)
#         print('唱歌')

# if __name__=='__main__':
#     # tatget 表示执行的参数,args用来传参,类型是元组
#     p1=multiprocessing.Process(target=dance,args=(5,))
#     p2=multiprocessing.Process(target=sing,args=(4,))
#     # p2=multiprocessing.Process(target=sing(4))  不呢这样使用,这样会连续执行
#     p1.start()
#     p2.start()

# _______________进程和线程的区别
# 进程是操作系统资源分配和调用里是独立单位
# 线程是进程的一个实体,是cpu调度的基础单元,自己不拥有系统资源,他只有运行中必不可少的资源(计数器,寄存器,栈)
# 线程可以在同一个进程中共享资源

# -------------进程间通信
# import multiprocessing
from multiprocessing import Queue


def produce(x):
    for i in range(10):
        print('+++{}'.format(i))
        x.put(i)


def comsumer(x):
    for i in range(10):
        print('---{}'.format(x.get()))   #注意get()


if __name__ == '__main__':
    q = Queue()   #注意()
# multiprocessing.Queue 进程间进行通信
# queue.Queue 线程间进行通信
    c1 = multiprocessing.Process(target=produce, args=(q,))
    c2 = multiprocessing.Process(target=comsumer, args=(q,))

    c1.start()
    c2.start()


